package com.appengine.dockstats;
//~--- non-JDK imports --------------------------------------------------------
import com.appengine.dockstats.entities.DockStation;
import com.appengine.dockstats.resource.StringBufferOutputStream;
import com.csvreader.CsvWriter;
import com.google.appengine.api.memcache.MemcacheService;
import com.google.appengine.api.memcache.MemcacheServiceFactory;
import net.sf.json.JSON;
import net.sf.json.xml.XMLSerializer;
import org.ho.yaml.YamlEncoder;
//~--- JDK imports ------------------------------------------------------------
import java.io.IOException;
import java.io.StringWriter;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* <p>
* A class to grab the data from the cache.
* </p>
*
* @author Sachin Handiekar
* @version 1.0
*/
public class DataGrabber {
private MemcacheService memcache;
public DataGrabber() {
memcache = MemcacheServiceFactory.getMemcacheService();
}
/**
* Get Dock Stats for all docks.
* @return xmlFeed
*/
public String getStats() {
StringBuffer buffer = new StringBuffer();
buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
buffer.append("<dockStationList>");
if (memcache.contains("cycleData")) {
buffer.append("<updatedOn>" + memcache.get("updateTime") + "</updatedOn>");
Map<Integer, DockStation> mp = (Map<Integer, DockStation>) memcache.get("cycleData");
Iterator it = mp.entrySet().iterator();
while (it.hasNext()) {
Map.Entry pairs = (Map.Entry) it.next();
buffer.append(pairs.getValue());
}
} else {
buffer.append("<error>Data Feed not available</error>");
}
buffer.append("</dockStationList>");
String xml = XmlUtils.formatXml(buffer.toString());
return xml;
}
/**
* <p>
* Get Dock Stats for a specific dockID.
* </p>
*
* @param dockID
* dockID for a docking station.
* @return xmlFeed
*/
public String getStats(int dockID) {
StringBuffer buffer = new StringBuffer();
buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
buffer.append("<dockStationList>");
if (memcache.contains("cycleData")) {
Map<Integer, DockStation> mp = (Map<Integer, DockStation>) memcache.get("cycleData");
if (mp.containsKey(dockID)) {
buffer.append("<updatedOn>" + memcache.get("updateTime") + "</updatedOn>");
buffer.append(mp.get(dockID));
} else {
String error = "<error>dockID not found</error>";
buffer.append(error);
}
} else {
buffer.append("<error>Data Feed not available</error>");
}
buffer.append("</dockStationList>");
String xml = XmlUtils.formatXml(buffer.toString());
return xml;
}
/**
* <p>
* Get stats as json.
* </p>
* @return
*/
public String getStatsAsJSON() {
String xml = getStats();
XMLSerializer xmlSerializer = new XMLSerializer();
JSON json = xmlSerializer.read(xml);
String jsonData = json.toString(2);
return jsonData;
}
/**
* <p>
* Get stats as json.
* </p>
*
* @param dockID
* dockStation id.
* @return jsonFeed
*
*/
public String getStatsAsJSON(int dockID) {
String xml = getStats(dockID);
XMLSerializer xmlSerializer = new XMLSerializer();
JSON json = xmlSerializer.read(xml);
String jsonData = json.toString(2);
return jsonData;
}
/**
* <p>
* Get stats as YAML.
* </p>
* @return stats as YAML.
*/
public String getStatsAsYAML() {
String temp = "YAML";
MemcacheService memcache = MemcacheServiceFactory.getMemcacheService();
StringBufferOutputStream outputStream = new StringBufferOutputStream();
YamlEncoder enc = new YamlEncoder(outputStream);
Map<String, String> columnValues = null;
if (memcache.contains("cycleData")) {
// buffer.append("<updatedOn>" + memcache.get("updateTime") + "</updatedOn>");
Map<Integer, DockStation> mp = (Map<Integer, DockStation>) memcache.get("cycleData");
Iterator it = mp.entrySet().iterator();
String updateTime = (String) memcache.get("updateTime");
while (it.hasNext()) {
columnValues = new HashMap<String, String>();
Map.Entry pairs = (Map.Entry) it.next();
DockStation ds = (DockStation) pairs.getValue();
columnValues.put("ID", ds.getId() + "");
columnValues.put("Name", ds.getName() + "");
columnValues.put("Latitude", ds.getLatitude() + "");
columnValues.put("Longitude", ds.getLongitude() + "");
columnValues.put("BikesAvailable", ds.getNbBikeAvailable() + "");
columnValues.put("EmptySlots", ds.getNbEmptyDocks() + "");
columnValues.put("Installed", ds.isInstalled() + "");
columnValues.put("Locked", ds.isLocked() + "");
columnValues.put("Temporary", ds.isTemporary() + "");
columnValues.put("UpdateTime", updateTime);
enc.writeObject(columnValues);
}
} else {
columnValues = new HashMap<String, String>();
columnValues.put("Error", "Data Feed not available");
enc.writeObject(columnValues);
}
enc.close();
temp = outputStream.toString();
return temp;
}
/**
*
* @return
* @throws IOException
*/
public String getStatsAsCSV() throws IOException {
String temp = "CSV";
StringWriter strWriter = new StringWriter();
char delimeter = ',';
CsvWriter writer = new CsvWriter(strWriter, delimeter);
MemcacheService memcache = MemcacheServiceFactory.getMemcacheService();
String[] columnName = {
"ID", "Name", "Latitude", "Longitude", "BikesAvailable", "EmptySlots", "Installed", "Locked", "Temporary",
"UpdateTime"
};
writer.writeRecord(columnName);
if (memcache.contains("cycleData")) {
// buffer.append("<updatedOn>" + memcache.get("updateTime") + "</updatedOn>");
Map<Integer, DockStation> mp = (Map<Integer, DockStation>) memcache.get("cycleData");
Iterator it = mp.entrySet().iterator();
String updateTime = (String) memcache.get("updateTime");
List<String> columnValues = null;
// writer.writeRecord(columns);
while (it.hasNext()) {
columnValues = new ArrayList<String>();
Map.Entry pairs = (Map.Entry) it.next();
DockStation ds = (DockStation) pairs.getValue();
columnValues.add(ds.getId() + "");
columnValues.add(ds.getName() + "");
columnValues.add(ds.getLatitude() + "");
columnValues.add(ds.getLongitude() + "");
columnValues.add(ds.getNbBikeAvailable() + "");
columnValues.add(ds.getNbEmptyDocks() + "");
columnValues.add(ds.isInstalled() + "");
columnValues.add(ds.isLocked() + "");
columnValues.add(ds.isTemporary() + "");
columnValues.add(updateTime);
String str[] = (String[]) columnValues.toArray(new String[columnValues.size()]);
writer.writeRecord(str);
}
} else {
// buffer.append("<error>Data Feed not available</error>");
}
temp = strWriter.toString();
return temp;
}
/**
* <p>
* Get time on which the feed was updated.
* </p>
*
* @return updatedTime
*/
public String getUpdateTime() {
String result = Constants.EMPTY_STRING;
if (memcache.contains("updateTime")) {
result = "Updated on " + memcache.get("updateTime");
} else {
result = "Couldn't get the updated time.";
}
return result;
}
}